.data

print_format:
	.string "%d\n"


.text

number_of_digits: # number_of_digits(digit), результат в %eax. Повертає кількість цифр в числі digit

        pushl %ebp
        movl %esp, %ebp

        xorl %ecx, %ecx # містить максимальний степінь числа
        movl $10, %ebx
        movl 8(%ebp), %eax # число

        jmp loop_compare
loop_begin:
        xorl %edx, %edx
        divl %ebx
        incl %ecx

loop_compare:
        cmpl $0, %eax
        jne loop_begin

        movl %ecx, %eax # повертаємо результат

        movl %ebp, %esp
        popl %ebp
        ret
#--------------------------------------------------------

exponentiation: # ф-ція піднесення до степеня. exponentiation(степінь, число), результат в %eax

        pushl %ebp
	movl %esp, %ebp

	movl $1, %eax # містить результат
	xorl %ecx, %ecx	

	jmp exponent_loop_compare
exponent_loop_begin:
	incl %ecx
	mull 12(%ebp)	

exponent_loop_compare:
	cmpl %ecx, 8(%ebp)
	jne exponent_loop_begin

	movl %ebp, %esp
	popl %ebp
	ret
#-----------------------------------------------------------

digits_to_string:  # digits_to_string(digit), результат в %eax

	pushl %ebp
	movl %esp, %ebp

        subl $12, %esp
        movl $0, -4(%ebp) # попереднє значення числа піднесеного до степеня

        pushl 8(%ebp)
        call number_of_digits

# виділення окремих цифр з числа

        movl %eax, -8(%ebp) # кількість цифр в числі
        movl %eax, %ecx

        decl %ecx # максимальний степінь

        subl -8(%ebp), %esp
        movl %esp, -12(%ebp) # буфер для строки (число в asccii вигляді)
	
	jmp cmp_l2
l2:
	pushl $10
	pushl %ecx
        call exponentiation
        popl %ecx

        decl %ecx

	xorl %edx, %edx
        movl %eax, %ebx # результат ф-ції exponentiation в %ebx
        movl 8(%ebp), %eax # поміщаємо число в регістр %eax
	divl %ebx

	movl %eax, %ebx
        movl -4(%ebp), %eax # попереднє значення поміщаємо в %eax
        movl %ebx, -4(%ebp) # обновляємо попереднє значення
        mull (%esp) # множимо на 10
	pushl %ebx
	movl %eax, %ebx
	popl %eax
	subl %ebx, %eax
        addl $0x30, %eax # в %eax міститься переведена в символ ascii цифра

        movl -12(%ebp), %edx # поміщаємо кожен символ в виділений буфер
	movl %eax, (%edx)
        incl -12(%ebp) # збільшуємо адрес на один байт

        addl $4, %esp
	
cmp_l2:
	cmpl $0, %ecx
        jge l2

        movl -8(%ebp), %eax
        addl %eax, -12(%ebp)

	movl $4, %eax
        movl $1, %ebx
        movl -12(%ebp), %ecx
        movl -8(%ebp), %edx
        int $0x80
	
			
	movl %ebp, %esp
	popl %ebp	

	ret	
#--------------------------------------------

.globl main
.type main, @function

main:
    pushl %ebp
    movl %esp, %ebp

    pushl $555
    call digits_to_string

    movl %ebp, %esp
    popl %ebp
    ret
